home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / mach / sun4.md / machTypes.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  8KB  |  226 lines

  1. /*
  2.  * machTypes.h --
  3.  *
  4.  *     Exported structures for the mach module.
  5.  *
  6.  * Copyright 1989 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  *
  15.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/mach/sun4.md/machTypes.h,v 1.6 91/10/18 01:24:52 dlong Exp $ SPRITE (Berkeley)
  16.  */
  17.  
  18. #ifndef _MACHTYPES
  19. #define _MACHTYPES
  20.  
  21. #ifdef KERNEL
  22. #include <sprite.h>
  23. #ifndef sun4c
  24. #include <devAddrs.h>
  25. #endif
  26. #include <machConst.h>
  27. #include <user/fmt.h>
  28. #else
  29. #ifndef sun4c
  30. #include <kernel/devAddrs.h>
  31. #endif
  32. #include <kernel/machConst.h>
  33. #include <fmt.h>
  34. #endif
  35.  
  36. /*
  37.  * The state of each processor: user mode or kernel mode.
  38.  */
  39. typedef enum {
  40.     MACH_USER,
  41.     MACH_KERNEL
  42. } Mach_ProcessorStates;
  43.  
  44. /*
  45.  * State for each process.
  46.  *
  47.  * IMPORTANT NOTE: 1) If the order or size of fields in these structures change
  48.  *           then the constants which give the offsets must be
  49.  *           changed in "machConst.h".
  50.  *
  51.  *           2) Mach_DebugState and Mach_RegState are the same thing.
  52.  *           If what the debugger needs changes, they may no longer be
  53.  *           the same thing.  Mach_RegState is used as a template for
  54.  *           saving registers to the stack for nesting interrupts, traps,
  55.  *           etc.  Therefore, the first sets of registers, locals and ins,
  56.  *           are in the same order as they are saved off of the sp for
  57.  *           a regular save window operation.  If this changes, changes
  58.  *           must be made in machAsmDefs.h and machConst.h.  Note that
  59.  *           this means the pointer to Mach_RegState for trapRegs in the
  60.  *           Mach_State structure is actually a pointer to registers saved
  61.  *           on the stack.
  62.  *
  63.  *           3) Mach_State defines the use of local registers.   Should
  64.  *           more local registers be necessary, then some of the special
  65.  *           registers (tbr, etc) will need to be saved after the globals.
  66.  *
  67.  *           4) Note that we must be careful about the alignment of
  68.  *           this structure, since it's saved and restored with load
  69.  *           and store double operations.  Without an aligner, this is
  70.  *           hard.  I'm not sure what to do about that.  Usually, this
  71.  *           just be space on the stack, so it will be double-word
  72.  *           aligned anyway.
  73.  */
  74.  
  75. /*
  76.  * The register state of a process: locals, then ins, then globals.
  77.  * The psr, tbr, etc, are saved in locals.  The in registers are the in
  78.  * registers of the window we've trapped into.  The calleeInputs is the
  79.  * area that we must save for the C routine we call to save its 6 input
  80.  * register arguments into if its compiled for debuggin.  The extraParams
  81.  * area is the place that parameters beyond the sixth go, since only 6 can
  82.  * be passed via input registers.  We limit this area to the number of extra
  83.  * arguments in a system call, since only sys-call entries to the kernel
  84.  * have this many args!  How do we keep it this way?  This is MESSY, since
  85.  * actually one of the calleeInputs is for a "hidden parameter" for an agregate
  86.  * return value, and one of them is really the beginning of the extra
  87.  * params.
  88.  */
  89. typedef struct Mach_RegState {
  90.     unsigned int    curPsr;                /* locals */
  91.     unsigned int    pc;
  92.     unsigned int    nextPc;
  93.     unsigned int    tbr;
  94.     unsigned int    y;
  95.     unsigned int    safeTemp;
  96.     unsigned int    volTemp1;
  97.     unsigned int    volTemp2;
  98.     unsigned int    ins[MACH_NUM_INS];        /* ins */
  99.                         /* callee saves inputs here */
  100.     unsigned int    calleeInputs[MACH_NUM_INS];
  101.                             /* args beyond 6 */
  102.     unsigned int    extraParams[MACH_NUM_EXTRA_ARGS];
  103.     unsigned int    globals[MACH_NUM_GLOBALS];    /* globals */
  104.     unsigned int     fsr;  /* FPU state register. Bit definition 
  105.                    * in machConst. */
  106.     int   numQueueEntries;    /* Number of floating point queue entries
  107.                    * active. */
  108.     unsigned int    fregs[MACH_NUM_FPS];    /* Floating point registers.
  109.                          * This can be treated as
  110.                          * MACH_NUM_FPS floats or
  111.                          * MACH_NUM_FPS/2 doubles. */
  112.     struct {
  113.     char          *address;      /* Address of FP instruction. */
  114.     unsigned int instruction; /* FP instruction value. */
  115.     }  fqueue[MACH_FPU_MAX_QUEUE_DEPTH];  /* Queue of unfinished floating 
  116.                        * point instructions. */
  117. } Mach_RegState;
  118.  
  119. /*
  120.  * Temporary hack so we can add fpu stuff without recompiling debuggers.
  121.  */
  122. #ifdef NOTDEF
  123. typedef    Mach_RegState    Mach_DebugState;
  124. #else
  125. typedef    struct    Mach_DebugState {
  126.     unsigned int    curPsr;                /* locals */
  127.     unsigned int    pc;
  128.     unsigned int    nextPc;
  129.     unsigned int    tbr;
  130.     unsigned int    y;
  131.     unsigned int    safeTemp;
  132.     unsigned int    volTemp1;
  133.     unsigned int    volTemp2;
  134.     unsigned int    ins[MACH_NUM_INS];        /* ins */
  135.                         /* callee saves inputs here */
  136.     unsigned int    calleeInputs[MACH_NUM_INS];
  137.                             /* args beyond 6 */
  138.     unsigned int    extraParams[MACH_NUM_EXTRA_ARGS];
  139.     unsigned int    globals[MACH_NUM_GLOBALS];    /* globals */
  140. } Mach_DebugState;
  141. #endif /* NOTDEF */
  142.  
  143. /*
  144.  * The machine-dependent signal structure.
  145.  */
  146. typedef struct Mach_SigContext {
  147.     unsigned    int    trapInst;    /* the sig ret trap instruction */
  148.     Address    pcValue;        /* pc to go to for signal */
  149.     Mach_RegState    userState;    /* user trap state before signal */
  150. } Mach_SigContext;
  151.  
  152. /*
  153.  * Gross hack to avoid circular include file problem.
  154.  */
  155. #ifdef KERNEL
  156. #include "sigTypes.h"
  157. #else
  158. #include <kernel/sigTypes.h>
  159. #endif
  160.  
  161. typedef struct Mach_RegWindow {
  162.      int locals[MACH_NUM_LOCALS];
  163.      int ins[MACH_NUM_INS];
  164. } Mach_RegWindow;
  165.  
  166. /*
  167.  * The state for a process - saved on context switch, etc.
  168.  */
  169. typedef struct Mach_State {
  170.     Mach_RegState    *trapRegs;        /* User state at trap time. */
  171.     Mach_RegState    *switchRegs;        /* Kernel state, switch time */
  172.     int            savedRegs[MACH_MAX_WINDOWS][MACH_NUM_WINDOW_REGS];
  173.                         /* Where we save all the
  174.                          * window's registers to if the
  175.                          * user stack isn't resident.
  176.                          * We could get away with 2
  177.                          * less windows if we wanted
  178.                          * to be tricky about recording
  179.                          * which is the invalid window
  180.                          * and which window we're in
  181.                          * while saving the regs...  */
  182.     int            savedMask;        /* Mask showing which windows
  183.                          * contained info that must
  184.                          * be restored to the stack from
  185.                          * the above buffer since the
  186.                          * stack wasn't resident. */
  187.     int            savedSps[MACH_MAX_WINDOWS];
  188.                         /* sp for each saved window
  189.                          * stored here to make it easy
  190.                          * to copy the stuff back out
  191.                          * to the user stack in the
  192.                          * correct place.  */
  193.     Address        kernStackStart;        /* top of kernel stack
  194.                          * for this process. */
  195.     int            fpuStatus;        /* FPU status. See below. */
  196.     Sig_Stack        sigStack;        /* sig stack holder for setting
  197.                          * up signal handling */
  198.     Sig_Context        sigContext;        /* sig context holder for
  199.                          * setting up signal handling */
  200.     int            lastSysCall;        /* Needed for migration. */
  201.     int            savedArgI0;        /* For syscall restart
  202.                          * Must follow lastSysCall.
  203.                          */
  204. } Mach_State;
  205.  
  206. /*
  207.  * Values for the fpuStatus field.
  208.  * MACH_FPU_ACTIVE - FPU is active for this process.
  209.  * MACH_FPU_EXCEPTION_PENDING - The process caused a FPU exception to occur.
  210.  */
  211. #define    MACH_FPU_ACTIVE            0x1
  212. #define    MACH_FPU_EXCEPTION_PENDING      0x2
  213.  
  214.  
  215. /*
  216.  * Structure on top of user stack when Sig_Handler is called.  This must
  217.  * a multiple of double-words!!!!
  218.  */
  219. typedef    struct {
  220.     Mach_RegState    extraSpace;    /* saved-window, etc, space */
  221.     Sig_Stack        sigStack;    /* signal stack for Sig_Handler */
  222.     Sig_Context        sigContext;    /* the signal context */
  223. } MachSignalStack;
  224.  
  225. #endif /* _MACHTYPES */
  226.